/** @module helper */
/**
 * 检测微信系统版本
 * @function compareVersion
 * @param { String } v1 当前版本
 * @param { String } v2 校验版本
 * @return { Number } 0：版本相同；1：当前版本高；-1：当前版本低(提示更新版本)
 */
function compareVersion(v1, v2) {
  v1 = v1.split('.')
  v2 = v2.split('.')
  const len = Math.max(v1.length, v2.length)
  while (v1.length < len) {
    v1.push('0')
  }
  while (v2.length < len) {
    v2.push('0')
  }

  for (let i = 0; i < len; i++) {
    const num1 = parseInt(v1[i])
    const num2 = parseInt(v2[i])

    if (num1 > num2) {
      return 1
    } else if (num1 < num2) {
      return -1
    }
  }

  return 0
}
/**
 * 检测当前的小程序是否是最新版本，是否需要下载、更新
 * @function: checkUpdateVersion
 */
function checkUpdateVersion() {
  // 判断微信版本是否 兼容小程序更新机制API的使用
  if (wx.canIUse('getUpdateManager')) {
    // 创建 UpdateManager 实例
    const updateManager = wx.getUpdateManager();
    // 检测版本更新
    updateManager.onCheckForUpdate(function(res) {
      // 请求完新版本信息的回调
      if (res.hasUpdate) {
        // 监听小程序有版本更新事件
        updateManager.onUpdateReady(function() {
          //TODO 新的版本已经下载好，调用 applyUpdate 应用新版本并重启 （ 此处进行了自动更新操作）
          updateManager.applyUpdate();
        })
        updateManager.onUpdateFailed(function() {
          // 新版本下载失败
          modal({
            title: '已经有新版本喽~',
            content: '请您删除当前小程序，到微信 “发现-小程序” 页，重新搜索打开哦~'
          })
        })
      }
    })
  } else {
    //TODO 此时微信版本太低（一般而言版本都是支持的）
    modal({
      title: '溫馨提示',
      content: '当前微信版本过低，无法使用该功能，请升级到最新微信版本后重试。'
    })
  }
}

/**
 * 小程序权限检测并授权
 * @function: TestAuthorize
 * @param { String } scope  权限范围
 * @param { String } content  授权提示语
 * @param { Function } successCallBack 成功授权回调
 * @param { Function } failCallBack 取消授权回调
 * @example
 * TestAuthorize('scope.writePhotosAlbum', '小程序需要您的微信授权保存图片，是否授权？')
 */
function TestAuthorize(scope, content, successCallBack, failCallBack) {
  // 获取用户设置
  wx.getSetting({
    success(res) {
      if (!res.authSetting[scope]) {
        // 授权请求
        wx.authorize({
          scope: scope,
          success: function () {
            successCallBack && successCallBack()
          },
          fail: function () {
            // 弹窗提示授权
            modal({
              content: content,
              success: function (result) {
                // 确定授权  
                if (result.confirm) {
                  wx.openSetting({
                    success: (response) => {
                      if (response.authSetting[scope]) {
                        successCallBack && successCallBack()
                      } else {
                        failCallBack && failCallBack()
                      }
                    }
                  })
                } else { // 取消授权
                  failCallBack && failCallBack()
                }
              }
            })
          }
        })
      }
    }
  })
}

/**
 * 消息提示框
 * @function: toast 
 * @property { Object } config 配置 
 * @property { String } config.title 提示的内容
 * @property { String } [ config.icon = 'none' ] 图标
 * @property { Number } [ config.duration = 1500 ] 标题
 * @property { Boolean } [ config.mask = true ] 是否显示透明蒙层
 * @property { Function } config.success 成功回调
 * @property { Function } config.fail 失败回调
 */
function toast(config) {
  const title = config.title
  const icon = config.icon || 'none'
  const duration = config.duration || 1500
  const mask = config.mask || true
  const successCallBack = config.success || function () {}
  const failCallBack = config.fail || function () {}
  wx.showToast({
    title,
    icon,
    duration,
    mask,
    success: successCallBack,
    fail: failCallBack
  })
}
 
/**
 * 模态对话框
 * @function: modal 
 * @property { Object } config 配置 
 * @property { String } [ config.title = '提示' ] 提示的标题
 * @property { String } config.content 提示的内容
 * @property { Boolean } [ config.showCancel = true ] 是否显示取消按钮
 * @property { String } [ config.cancelText = '取消' ] 取消按钮的文字
 * @property { String } [ config.confirmText = '确定' ] 确认按钮的文字
 * @property { String } [ config.confirmColor = '' ] 确认按钮的颜色
 * @property { Function } config.success 成功回调
 */
function modal(config) {
  const title = config.title || '提示'
  const content = config.content || ''
  const showCancel = config.showCancel || true
  const cancelText = config.cancelText || '取消'
  const confirmText = config.confirmText || '确定'
  const confirmColor = config.confirmColor || ''
  const successCallBack = config.success || function() {}
  wx.showModal({
    title,
    content,
    showCancel,
    cancelText,
    confirmText,
    confirmColor,
    success: successCallBack()
  })
}

/**
 * 加载框
 * @function: load
 * @property { Object } config 配置 
 * @property { String } [ config.title = '加载中' ] 提示的内容
 * @property { Boolean } [ config.mask = true ] 是否显示透明蒙层
 */
function load(config) {
  const title = config.title || '加载中'
  const mask = config.mask || true
  wx.showLoading({
    title,
    mask
  })
}

/**
 * 检测登录状态
 * @return { Boolean }
 */
async function checkHasLogined() {
  const token = wx.getStorageSync('token')
  if (!token) {
    return false
  }
  const loggined = await checkSession()
  if (!loggined) {
    wx.removeStorageSync('token')
    return false
  }
  return true
}

function checkSession(){
  return new Promise((resolve, reject) => {
    wx.checkSession({
      success() {
        return resolve(true)
      },
      fail() {
        return resolve(false)
      }
    })
  })
}

/**
 * 获取微信code
 * @return { Promise }
 */
function getWXCode(){
  return new Promise((resolve, reject) => {
    wx.login({
      success(res) {
        return resolve(res.code)
      },
      fail() {
        wx.showToast({
          title: '获取code失败',
          icon: 'none'
        })
        return resolve('获取code失败')
      }
    })
  })
}

/**
 * 获取微信用户信息
 * @return { Promise }
 */
function getUserInfo() {
  return new Promise((resolve, reject) => {
    wx.getUserInfo({
      success: res => {
        return resolve(res)
      },
      fail: err => {
        console.error(err)
        return resolve()
      }
    })
  })
}
module.exports = {
  compareVersion: compareVersion,
  checkUpdateVersion: checkUpdateVersion,
  TestAuthorize: TestAuthorize,
  toast: toast,
  modal: modal,
  load: load,
  checkHasLogined: checkHasLogined,
  getWXCode: getWXCode,
  getUserInfo: getUserInfo
}
